package Spring2024_5_10;

/**
 * 框架
 *  半成品
 *  让程序员把更多的精力放在业务逻辑功能上
 *      例如 数据校验 在不添加框架的前提下需要自己结合预编译SQL语句手动判断 而框架可完全自动进行判断校验
 *  不同的编程语言有不同的框架 难点在于操作流程的泛用程度
 *      Java中主要是Spring框架
 *
 * Spring Framework版本
 *  自2004年起 已经进入6版本 我们现在使用的是5版本 因为6版本不兼容Java JDK8 最低兼容JDK17
 *
 * SSM框架
 *  Spring Framework
 *  Spring MVC
 *  MyBatis
 */
public class Spring {
    //Spring框架

    //Spring是一个资源整合框架 整合一切可以整合的资源(整合自身的和部分其他的优秀第三方框架)
    //Spring Framework 整个Spring生态的核心
    //Spring有两个核心 1 IoC控制反转 2 AOP面向切面编程
    /**
     * Spring Framework
     * 本框架中最底层的部分 几乎所有Spring的内容都基于此部分
     */
    /**
     * IoC
     * 控制反转的编程思想
     *  把创建对象和对象之间的管理交给Spring进行管理
     *  环境自动将资源准备好 我们享受资源注入
     *  IoC容器(真实存在的)
     *      实现IoC思想的工具或技术手段
     *      由IoC容器管理的java对象称为Spring Framework对象
     * 总结
     * 1.什么是IoC
     *  控制反转的编程思想
     * 2.如何实现IoC思想
     *  IoC容器是实现IoC思想的一种技术手段
     * 3.IoC容器是如何创建的
     *  通过ApplicationContext接口实现的
     * 4.ApplicationContext接口创建IoC容器的方式有哪些
     *  1.注解方式: AnnotationConfigApplicationContext(包路径)
     *      注解:@Component
     *  2.xml方式: ClasspathXmlApplicationContext(xxx.xml)----此方法使用较少
     *      1.创建一个类(先创建包再创建类为宜)
     *      2.创建资源文件(资源文件一般不与工程文件混放 一般放在resources中)
     *          XML Config..在resources中(外部文件)
     *      3.添加标签<bean>"userXml" class="cn.tedu.spring.beanxml.UserXml"</bean>
     *                        ID      给谁创建bean对象--添加路径
     *          其他操作也有对应标签 如属性赋值等
     *      4.添加测试类 关键字: ClasspathXmlApplicationContext("bean.xml");
     *
     * Spring Bean对象存入IoC容器时会被命名,默认为: 类名(首字母小写)
     *            因此后续创建类时不应重名 否则扫描时会产生影响
     *
     * AOP 面向对象编程的补充和完善
     */
    /*
        常用快捷键
            1 代码自动折行 右键行号位置 选择 Soft-Wrap
            2 复制路径快捷键(点击在包或类上)
                2.1
                2.2
                2.3 ctrl shift c 复制全路径
            3 快速补全: -方法-.var 回车并选择合适对象名
     */
    /**
     * 常见错误 未添加注解 或 路径错误 测试时会报异常 NoSuchBean..Exception
     */
    /**
     * 解耦思想 降低方法或每一个"层"的耦合度 使方法或功能分区更专一明了
     *  分层一般有三层
     *      1 控制器层 接受请求 返回响应
     *      2 业务逻辑层 处理业务逻辑
     *      3 数据访问层 和数据库交互
     */
    /**
     * -Bean对象-
     * 注解
     *  下述四个注解都能实现创建bean对象的功能 区别是层的不同 且都只能添加到类上
     *      1 @Component 可以在任意层次 如Service层 Dao层等 只用于描述Spring中的bean
     *                   仅仅是标识容器中的组件
     *      2 @Repository 数据访问层 和数据库交互
     *      3 @Service 业务逻辑层 处理业务逻辑
     *      4 @Controller 在控制器层 接受请求 返回响应
     *  若一个注解也不加 会抛出: NoSuchBeanDefinitionException 异常
     *
     *  改变Bean对象名字 默认为类对象(首字母小写),手动指定时在注解后添加: (value = "自定义名称")
     *  例如 @Repository(value = "ABC")
     */
    /**
     * -依赖注入-
     * 注解
     *  -1- @Value("值")
     *  主要用于注入简单类型的属性
     *      添加位置
     *      1.属性上 给简单类型的属性赋值
     *      2.set方法上 也可以完成赋值
     *
     *  -2- @Autowired
     *  自动装配 自动注入 注入对象或接口类型的数据
     *      添加位置
     *      1.属性上
     *      2.set方法
     *      3.构造方法
     *   若不在目标类上添加注解 无法创建bean对象会报如下错误 表示无法注入
     *   Unsatisfied(未满足的)Dependency(依赖)Exception(异常)
     *
     *   若添加了多个实现类且不做手动指定 @Autowired无法精准识别
     *   会报错 NoUnique(非唯一的)Bean(bean对象)Definition(不满足的)Exception(异常)
     *   原因
     *    只能根据类型进行装配 不能根据IoC容器中Spring Bean对象名称进行装配
     *   解决方案
     *    结合@Qualifier(value = "Spring Bean对象名称")注解 根据Bean对象名称进行装配
     *
     * Caused by 异常原因关键词
     *
     *  -3- @Qualifier(value = "Spring Bean对象名称")
     *  根据Spring Bean对象名称进行装配
     *
     *  -4- @Resource
     *  是JDK扩展包中的 属于JDK的一部分 所以该注解为标准注解 而@Autowired注解是Spring框架自己的
     *  此注解在JDK15后寄了 因此用的较少 但是面试时经常被问到
     *  装配规则
     *   1.默认根据名称装配 byName 即根据IoC容器中的Spring Bean对象的名称进行装配
     *   2.未指定Spring Bean的[name参数]时 则把属性名作为Spring Bean对象的名称进行装配
     *   3.属性名和Bean对象的名称不一致时 根据类型进行装配
     */
}
